package com.efast.cafe.portal.service.api.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.efast.cafe.portal.bean.api.PortalApiTreeBean;
import com.efast.cafe.portal.bean.api.PortalApiTreeQueryBean;
import com.efast.cafe.portal.bean.api.PortalTreeNodeBean;
import com.efast.cafe.portal.dao.api.PortalApiTreeDao;
import com.efast.cafe.portal.entity.base.PortalBaseLov;
import com.efast.cafe.portal.service.api.IPortalApiTreeServcie;
import com.efast.cafe.portal.service.base.IPortalBaseLovService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class PortalApiTreeServcieImpl implements IPortalApiTreeServcie {
	@Autowired
	private PortalApiTreeDao portalApiTreeDao;
	@Autowired
	private IPortalBaseLovService portalBaseLovService;

	@Override
	public Map<String, Object> queryTree(PortalApiTreeQueryBean apiTreeBean) {
		// TODO Auto-generated method stub
		List<PortalTreeNodeBean> treeNodeBeans = new ArrayList<PortalTreeNodeBean>();
		Map<String, Object> map = new HashMap();
		List<PortalBaseLov> listLov = portalBaseLovService.getPortalBaseLovSelect("PORTAL.API.NODES", "Global");
		if (apiTreeBean.getTypeFilters()!=null) {
			if(apiTreeBean.getTypeFilters().size()==0){
				apiTreeBean.setTypeFilter(-1);
				List<PortalApiTreeBean> list = portalApiTreeDao.queryTree(apiTreeBean);
				treeNodeBeans =  getData(list, apiTreeBean);
			}else{
				for (int k = 0; k < apiTreeBean.getTypeFilters().size(); k++) {
					apiTreeBean.setTypeFilter(apiTreeBean.getTypeFilters().get(k));
					List<PortalApiTreeBean> list = portalApiTreeDao.queryTree(apiTreeBean);
					List<PortalTreeNodeBean> treeNodeBean = new ArrayList<PortalTreeNodeBean>();
					treeNodeBean = getData(list, apiTreeBean);
					treeNodeBeans.addAll(treeNodeBean);
				}
			}
			
		}else{
			List<PortalApiTreeBean> list = portalApiTreeDao.queryTree(apiTreeBean);
			treeNodeBeans =  getData(list, apiTreeBean);
		}
				
		map.put("data", treeNodeBeans);
		map.put("nodes", listLov);
		return map;
	}
	
	public List<PortalTreeNodeBean>  getData(List<PortalApiTreeBean> list,PortalApiTreeQueryBean apiTreeBean){
		//@TODO
		List<PortalTreeNodeBean> treeNodeBeans = new ArrayList<PortalTreeNodeBean>();
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).getProject().getId() != null) {
				PortalTreeNodeBean projectBean = new PortalTreeNodeBean();
				projectBean.setData(list.get(i).getProject());
				projectBean.setLeaf(false);
				projectBean.setTitle(list.get(i).getProject().getName());
				projectBean.setType(0);
				if (i == 0) {
					treeNodeBeans.add(projectBean);
				} else if (i > 0 && !list.get(i).getProject().getId().equals(list.get(i - 1).getProject().getId())) {
					treeNodeBeans.add(projectBean);
				}
			}
			if (list.get(i).getSystem() != null) {
				if (!list.get(i).getSystem().isEmpty()) {
					for (int j = 0; j < list.get(i).getSystem().size(); j++) {
						if (list.get(i).getSystem().get(j).getId() != null) {
							PortalTreeNodeBean systemBean = new PortalTreeNodeBean();
							if (list.get(i).getSystem().get(j).getPid() == null) {
								list.get(i).getSystem().get(j).setPid(apiTreeBean.getId());
							}
							systemBean.setData(list.get(i).getSystem().get(j));
							systemBean.setLeaf(false);
							systemBean.setTitle(list.get(i).getSystem().get(j).getName());
							systemBean.setType(1);
							treeNodeBeans.add(systemBean);
						}
					}
				}
			}
			if (list.get(i).getModule() != null) {
				if (!list.get(i).getModule().isEmpty()) {
					for (int j = 0; j < list.get(i).getModule().size(); j++) {
						if ((list.get(i).getModule().get(j).getId()) != null) {
							PortalTreeNodeBean moduleBean = new PortalTreeNodeBean();
							if (list.get(i).getModule().get(j).getPid() == null) {
								list.get(i).getModule().get(j).setPid(apiTreeBean.getId());
							}
							moduleBean.setData(list.get(i).getModule().get(j));
							moduleBean.setLeaf(false);
							moduleBean.setTitle(list.get(i).getModule().get(j).getName());
							moduleBean.setType(2);
							treeNodeBeans.add(moduleBean);
						}
					}

				}
			}

			if (list.get(i).getObject() != null) {
				if (!list.get(i).getObject().isEmpty()) {
					for (int j = 0; j < list.get(i).getObject().size(); j++) {
						if ((list.get(i).getObject().get(j).getId()) != null) {
							PortalTreeNodeBean objectBean = new PortalTreeNodeBean();
							if (list.get(i).getObject().get(j).getPid() == null) {
								list.get(i).getObject().get(j).setPid(apiTreeBean.getId());
							}
							objectBean.setData(list.get(i).getObject().get(j));
							objectBean.setLeaf(true);
							objectBean.setTitle(list.get(i).getObject().get(j).getName());
							objectBean.setType(4);
							treeNodeBeans.add(objectBean);
						}
					}

				}

			}

			if (list.get(i).getService() != null) {
				if (!list.get(i).getService().isEmpty()) {
					for (int j = 0; j < list.get(i).getService().size(); j++) {
						if ((list.get(i).getService().get(j).getId()) != null) {
							PortalTreeNodeBean serviceBean = new PortalTreeNodeBean();
							if (list.get(i).getService().get(j).getPid() == null) {
								list.get(i).getService().get(j).setPid(apiTreeBean.getId());
							}
							serviceBean.setData(list.get(i).getService().get(j));
							serviceBean.setLeaf(true);
							serviceBean.setTitle(list.get(i).getService().get(j).getName());
							serviceBean.setType(3);
							treeNodeBeans.add(serviceBean);
						}
					}

				}

			}

			if (list.get(i).getSqlTemplate() != null) {
				if (!list.get(i).getSqlTemplate().isEmpty()) {
					for (int j = 0; j < list.get(i).getSqlTemplate().size(); j++) {
						if ((list.get(i).getSqlTemplate().get(j).getId()) != null) {
							PortalTreeNodeBean sqlTemplateBean = new PortalTreeNodeBean();
							if (list.get(i).getSqlTemplate().get(j).getPid() == null) {
								list.get(i).getSqlTemplate().get(j).setPid(apiTreeBean.getId());
							}
							sqlTemplateBean.setData(list.get(i).getSqlTemplate().get(j));
							sqlTemplateBean.setLeaf(true);
							sqlTemplateBean.setTitle(list.get(i).getSqlTemplate().get(j).getName());
							sqlTemplateBean.setType(5);
							treeNodeBeans.add(sqlTemplateBean);
						}
					}

				}

			}
			
		}
		return treeNodeBeans;
	}

}
